<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>
          Google Web Toolkit
          
            -
            Asynchronous Testing</title>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<link href="../css/base.css" rel="stylesheet" type="text/css">
<link href="./doc.css" rel="stylesheet" type="text/css">
<link href="../css/print.css" rel="stylesheet" media="print" type="text/css">
</head>
<body>
<div id="gaia">&nbsp;</div>
<div id="header">
<div id="logo">
<a href="http://code.google.com/"><img src="http://code.google.com/images/code_sm.png" alt="Google"></a>
</div>
<div id="title">Google Web Toolkit (Beta)</div>
<div id="breadcrumbs">
<div id="nextprev">
<nobr><a href="com.google.gwt.doc.DeveloperGuide.JUnitIntegration.html">&laquo; prev</a></nobr><nobr><a href="com.google.gwt.doc.DeveloperGuide.Internationalization.html">next &raquo;</a></nobr>
</div>
<span class="item"><a href="http://code.google.com/">Google Code Home</a></span>
        &gt;
        <span class="item"><a href="http://code.google.com/webtoolkit/">Google Web Toolkit</a></span>
        &gt;
        
        <span class="item"><a xmlns="" href="com.google.gwt.doc.DeveloperGuide.html">Developer Guide</a></span> &gt;
						<span class="item"><a href="com.google.gwt.doc.DeveloperGuide.JUnitIntegration.html">JUnit Integration</a></span> &gt;
						<span class="selected item">Asynchronous Testing</span>
</div>
</div>
<div id="side">
<div id="menu">
<h4>
<a href="http://code.google.com/webtoolkit/">Google Web Toolkit</a>
</h4>
<ul>
<li>
<a href="http://code.google.com/webtoolkit/download.html">Download GWT</a>
</li>
</ul>
<ul>
<li>
<a href="http://code.google.com/webtoolkit/overview.html">Product Overview</a>
</li>
<li>
<a href="http://code.google.com/webtoolkit/gettingstarted.html">Getting Started Guide</a>
</li>
<li>
<a href="http://code.google.com/webtoolkit/documentation/examples/">Example Projects</a>
</li>
</ul>
<ul>
<li>
<a class="selected" href="./com.google.gwt.doc.DeveloperGuide.html">Developer Guide</a>
</li>
<li>
<a href="./gwt.html">Class Reference</a>
</li>
<li>
<a href="http://code.google.com/webtoolkit/issues/">Issue Tracking</a>
</li>
<li>
<a href="http://groups.google.com/group/Google-Web-Toolkit">Developer Forum</a>
</li>
</ul>
<ul>
<li>
<a href="http://googlewebtoolkit.blogspot.com/">GWT Blog</a>
</li>
<li>
<a href="http://code.google.com/webtoolkit/faq.html">GWT FAQ</a>
</li>
<li>
<a href="http://code.google.com/webtoolkit/makinggwtbetter.html">Making GWT Better</a>
</li>
</ul>
<ul>
<li>
<a href="http://code.google.com/webtoolkit/thirdparty.html">Third Party Tools</a>
</li>
</ul>
</div>
<div id="search">
<form action="http://www.google.com/search" method="get">
<div>
<input name="domains" value="code.google.com" type="hidden"><input name="sitesearch" value="code.google.com" type="hidden">
<div class="header">Search this site:</div>
<div class="input">
<input name="q" size="10">
</div>
<div class="button">
<input value="Search" type="submit">
</div>
</div>
</form>
</div>
</div>
<div xmlns="http://www.w3.org/1999/xhtml" id="body">
<h1>Asynchronous Testing</h1>GWT's <a href="http://www.junit.org">JUnit</a> integration provides
 special support for testing functionality that cannot execute in
 straight-line code. For example, you might want to make an
 <a xmlns="" href="com.google.gwt.doc.DeveloperGuide.RemoteProcedureCalls.html">RPC</a> call to a server and then
 validate the response. However, in a normal JUnit test run, the test
 stops as soon as the test method returns control to the caller, and GWT
 does not support multiple threads or blocking. To support this use case,
 <a href="com.google.gwt.junit.client.GWTTestCase.html">GWTTestCase</a> has extended the <code>TestCase</code> API.
 
 <p>
 The two key methods are <a href="com.google.gwt.junit.client.GWTTestCase.html#delayTestFinish(int)">GWTTestCase.delayTestFinish(int)</a> and
 <a href="com.google.gwt.junit.client.GWTTestCase.html#finishTest()">GWTTestCase.finishTest()</a>. Calling <code>delayTestFinish()</code>
 during a test method's execution puts that test in asynchronous mode,
 which means the test will not finish when the test method returns control
 to the caller. Instead, a <i>delay period</i> begins, which lasts the
 amount of time specified in the call to <code>delayTestFinish()</code>.
 During the delay period, the test system will wait for one of three
 things to happen:
 
 <ol>
<li> If <code>finishTest()</code> is called before the delay period
 expires, the test will succeed.</li>
<li> If any exception escapes from an event handler during the delay
 period, the test will error with the thrown exception.</li>
<li> If the delay period expires and neither of the above has happened,
 the test will error with a
 <a href="com.google.gwt.junit.client.TimeoutException.html">TimeoutException</a>. </li>
</ol>
</p>
<p>
 The normal use pattern is to setup an event in the test method and call
 <code>delayTestFinish()</code> with a timeout significantly longer than
 the event is expected to take. The event handler validates the event and
 then calls <code>finishTest()</code>.
 </p>
<p>
<h3>Example</h3>
<pre class="code">public void testTimer() {
  // Setup an asynchronous event handler.
  Timer timer = new Timer() {
    public void run() {
      // do some validation logic

      // tell the test system the test is now done
      finishTest();
    }
  };

  // Set a delay period significantly longer than the
  // event is expected to take.
  delayTestFinish(500);

  // Schedule the event and return control to the test system.
  timer.schedule(100);
}
</pre>
</p>
<div class="tipContainer" xmlns="http://www.w3.org/1999/xhtml">
<div class="tipCallout">Tip</div>
<div class="tipBody">The recommended pattern is to test one asynchronous event per test
      method. If you need to test multiple events in the same method, here
      are a couple of techniques:
 
 <ul>
<li> "Chain" the events together. Trigger the first event during the test
 method's execution; when that event fires, call
 <code>delayTestFinish()</code> again with a new timeout and trigger the
 next event. When the last event fires, call <code>finishTest()</code>
 as normal. </li>
<li> Set a counter containing the number of events to wait for. As each
 event comes in, decrement the counter. Call <code>finishTest()</code>
 when the counter reaches <code>0.</code>
</li>
</ul>
</div>
</div>
<div class="topicSeeAlso">
<h2>Related topics</h2>
<a xmlns="" href="com.google.gwt.junit.client.GWTTestCase.html#delayTestFinish(int)">GWTTestCase.delayTestFinish(int)</a>,<a href="com.google.gwt.junit.client.GWTTestCase.html#finishTest()">GWTTestCase.finishTest()</a>
</div>
</div>
<div id="footer" xmlns="http://www.w3.org/1999/xhtml">
          &copy;2007 Google
          <span class="noprint">
            -
            <a href="http://www.google.com/">Google Home</a>
            -
            <a href="http://www.google.com/jobs/">We're Hiring</a>
            -
            <a href="http://www.google.com/privacy.html">Privacy Policy</a>
            -
            <a href="http://www.google.com/terms_of_service.html">Terms of Service</a>
            -
            <a href="mailto:code@google.com">Contact Us</a></span>
<div id="license" style="text-align: center; margin: 1em 0em 1em 0em">
            Except as otherwise
            <a href="http://code.google.com/policies.html#restrictions">noted</a>, the content of this  page is licensed under the  <a rel="license" href="http://creativecommons.org/licenses/by/2.5/">Creative Commons Attribution 2.5 License</a>.
              <!--
            <rdf:RDF xmlns="http://web.resource.org/cc/">
<Work rdf:about="">
<license rdf:resource="http://creativecommons.org/licenses/by/2.5/"></license>
</Work>
<License rdf:about="http://creativecommons.org/licenses/by/2.5/">
<permits rdf:resource="http://web.resource.org/cc/Reproduction"></permits>
<permits rdf:resource="http://web.resource.org/cc/Distribution"></permits>
<requires rdf:resource="http://web.resource.org/cc/Notice"></requires>
<requires rdf:resource="http://web.resource.org/cc/Attribution"></requires>
<permits rdf:resource="http://web.resource.org/cc/DerivativeWorks"></permits>
</License>
</rdf:RDF>
              -->
            </div>
</div>
<script src="https://ssl.google-analytics.com/urchin.js" type="text/javascript" xmlns="http://www.w3.org/1999/xhtml"></script><script type="text/javascript">
          _uacct="UA-18071-1"; _uanchor=1; urchinTracker();
        </script>
</body>
</html>
